home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / DESKTOP / MYMENU.ZIP / Sources / SourceRM (.txt) next >
RISC OS BBC BASIC V Source  |  1997-01-29  |  24KB  |  869 lines

  1.  Richard Atterer 1996
  2. =0:sp=13:lr=14:
  3. $" at line ";
  4. 0save$=":4.$.Coding.MyMenu.!MyMenu.!RunImage"
  5. type$="Module"
  6. ,size%=5<<10:
  7.  code% size%:L%=code%+size%
  8. debugging%=0
  9. debugging%
  10. "Lib:Debug2"
  11. washerefile$="RAM:IWasHere"
  12. *washerefile$="<MyMenu$Dir>.^.IWasHere"
  13. Message_SaveDesktop=10
  14. Message_MenusDeleted=&400C9
  15. Message_HelpRequest=&502
  16. Message_HelpReply=&503
  17. !code%=3:
  18. "OS_Word",14,code%:
  19. "Territory_ConvertDateAndTime",1,code%,code%+8,256,"%DY %M3 %CE%YR"
  20. ,A%:d$="":
  21. B%=code%+8 
  22. A%-1:d$=d$+
  23. "Territory_ConvertDateAndTime",1,code%,code%+8,256,"%ZDY
  24. %CE%YR"
  25. ,A%:date$="":
  26. B%=code%+8 
  27. A%-1:date$=date$+
  28. p%=12
  29. 2:O%=code%:P%=0
  30. :p=p%:
  31. B%,B%,C%:
  32. p%=14 
  33. C%>0 p=p%
  34.     [optp
  35. -;______...____________________;__________
  36. .module
  37. dcd start
  38. dcd initialisation
  39. dcd finalisation
  40. dcd servicecall
  41. dcd titlestring
  42. dcd helpstring
  43. dcd commandtable
  44. #-;________________________________________
  45. .postfilter
  46. &/teq    r0,#6                  ;mouse clicks
  47. '.teqne  r0,#8                  ;key presses
  48. movnes pc,lr
  49. stmfd  sp !,{lr}
  50. *#ldrb   r14,[r12,#interceptwimp]
  51. +4teq    r14,#0                 ;is flag byte =0 ?
  52. mvnne  r0,#0
  53. -7ldmfd  sp !,{pc}^             ;y > don't intercept!
  54. /,.postfiltermask dcd%11100011100000110011
  55. 0-;________________________________________
  56. .initialisation
  57. stmfd  sp !,{r7,r11,lr}
  58. debugging%
  59.   [optp
  60.   bl IWasHere_NewFile
  61.   adr r0,module
  62. d("module start=^0^"):]
  63. :[optp
  64. ldr    r11,[r12]
  65. teq    r11,#0
  66. mov    r4,#0
  67. strne  r4,[r11,#lastopened]
  68. bne    init2
  69. mov    r0,#6
  70. mov    r3,#rmablocksize%
  71. swi    "XOS_Module"
  72. ldmvsfdsp !,{r7,r11,lr}
  73. orrvss pc,lr,#1<<28
  74. mov    r11,r2
  75. mov    r4,#0
  76. str    r4,[r11,#taskhandle]
  77. str    r4,[r11,#lastopened]
  78. str    r4,[r11,#relocadr]
  79. K str    r4,[r11,#keyspressed]
  80. str    r4,[r11,#keys]
  81. mov    r0,#17
  82. adr    r1,menufile
  83. swi    "XOS_File"
  84. teq    r0,#1
  85. bne    init_stop3
  86. mov    r6,r2,lsl#24
  87. mov    r7,r3
  88. mov    r0,#17
  89. debugging%
  90.   [optp
  91.   adr  r1,menuscan-1024
  92.   add  r1,r1,#1024:]
  93.   [optp
  94.   adr  r1,menuscan:]
  95. :[optp
  96. swi    "XOS_File"
  97. teq    r0,#0
  98. `9beq    scanfile               ;MenuScan doesn't exist
  99. teq    r0,#1
  100. bne    init_stop3
  101. teq    r2,r6,lsl#24
  102. teqne  r3,r7
  103. beq    init3
  104. .scanfile
  105. d("scanning menu")
  106. adr    r0,scanutil
  107. swi    "XOS_CLI"
  108. bvs    init_stop2
  109. d("menu scanned")
  110. .init3
  111. mov    r0,#&4f
  112. debugging%
  113.   [optp
  114.   adr  r1,menuscan-1024
  115.   add  r1,r1,#1024:]
  116.   [optp
  117.   adr  r1,menuscan:]
  118. :[optp
  119. x,swi    "XOS_Find"             ;open file
  120. bvs    init_stop2
  121. mov    r1,r0
  122. mov    r0,#4
  123. add    r2,r11,#totalsize
  124. mov    r3,#6<<2
  125. ~5swi    "XOS_GBPB"             ;read 6 word header
  126. bvs    init_stop
  127. ldrb   r3,[r11,#ondemand]
  128. <teq    r3,#0                  ;load all or just hotkeys?
  129. ldr    r4,[r11,#hotkeysize]
  130. /movne  r3,r4                  ;just hotkeys
  131. &ldreq  r3,[r11,#totalsize]    ;all
  132. movne  r0,#&8000
  133. strne  r0,[r11,#menublock]
  134. mov    r0,#13
  135. mov    r2,r11
  136. swi    "XOS_Module"
  137. bvs    init_stop
  138. mov    r11,r2
  139. str    r11,[r12]
  140. mov    r0,#4
  141. add    r2,r11,#hotkeys
  142. swi    "XOS_GBPB"
  143. bvs    init_stop
  144. mov    r0,#0
  145. (swi    "XOS_Find"             ;close
  146. bvs    init_stop2
  147. .init2
  148. ldr    r0,[r11,#menublock]
  149. teq    r0,#&8000
  150. ldrne  r0,[r11,#hotkeysize]
  151. addne  r0,r0,r11
  152. addne  r0,r0,#hotkeys
  153. strne  r0,[r11,#menublock]
  154. !mov    r0,#&10 ;=event vector
  155. adr    r1,event
  156. mov    r2,r11
  157. swi    "OS_Claim"
  158. d("EventV claimed")
  159. mov    r0,#14
  160. "mov    r1,#11 ;=keypress event
  161. swi    "OS_Byte"
  162. ldr    r1,[r11,#mouse]
  163. teq    r1,#0
  164. &movne  r1,#10 ;=mouse button event
  165. swine  "OS_Byte"
  166. adr    r0,titlestring
  167. adr    r1,postfilter
  168. mov    r2,r11
  169. ,mov    r3,#0                  ;all tasks
  170. ldr    r4,postfiltermask
  171. &swi    "Filter_RegisterPostFilter"
  172. d("init finished")
  173. ldmfd  sp !,{r7,r11,pc}^
  174. ;____________
  175. .init_stop3
  176. mov    r2,r0
  177. mov    r0,#19
  178. swi    "XOS_File"
  179. b      init_stop2
  180. .init_stop
  181. mov    r7,r0
  182. mov    r0,#0
  183. swi    "XOS_Find"
  184. .init_stop2
  185. movvs  r7,r0
  186. .init_stop1
  187. mov    r0,#7
  188. mov    r2,r11
  189. swi    "XOS_Module"
  190. movvc  r0,r7
  191. ldmfd  sp !,{r7,r11,lr}
  192. orrs   pc,lr,#1<<28
  193. -;________________________________________
  194. .finalisation
  195. stmfd  sp !,{r14}
  196. ldr    r12,[r12]
  197. d("final1")
  198. ldr    r0,[r12,#taskhandle]
  199. cmp    r0,#0
  200. ldrgt  r1,task
  201. swigt  "XWimp_CloseDown"
  202. mov    r1,#0
  203. str    r1,[r12,#taskhandle]
  204. d("final2")
  205. adr    r0,titlestring
  206. adr    r1,postfilter
  207. mov    r2,r12
  208. mov    r3,#0
  209. ldr    r4,postfiltermask
  210. (swi    "Filter_DeRegisterPostFilter"
  211. d("final3")
  212. mov    r0,#13
  213. "mov    r1,#11 ;=keypress event
  214. swi    "OS_Byte"
  215. d("final4")
  216. ldr    r1,[r12,#mouse]
  217. teq    r1,#0
  218. &movne  r1,#10 ;=mouse button event
  219. swine  "OS_Byte"
  220. d("final5")
  221. !mov    r0,#&10 ;=event vector
  222. adr    r1,event
  223. mov    r2,r12
  224. swi    "XOS_Release"
  225. d("EventV released")
  226. ldmfd  sp !,{pc}
  227. -;________________________________________
  228. .event
  229. teq    r0,#10
  230. teqne  r0,#11
  231. movnes pc,lr
  232. stmfd  sp !,{r0,r3-r7,lr}
  233. teq    r0,#10
  234. beq    mouseevent
  235.  ldrb   r3,[r12,#keyspressed]
  236. teq    r1,#0
  237. ldr    r4,[r12,#keys]
  238. subeq  r3,r3,#1
  239. addne  r3,r3,#1
  240. moveq  r4,r4,lsr#8
  241. orrne  r4,r2,r4,lsl#8
  242. Ktst    r3,#1<<31              ;in case keys were pressed down while the
  243. Lmovne  r3,#0                  ;module started up (which is likely if you
  244. Cmovne  r4,#0                  ;double-clicked the application!)
  245.  strb   r3,[r12,#keyspressed]
  246. str    r4,[r12,#keys]
  247. teq    r3,#0
  248. ldmeqfdsp !,{r0,r3-r7,pc}^
  249. mov    r0,#&ff
  250. and    r5,r0,r4,lsr#8
  251. and    r6,r0,r4,lsr#16
  252. mov    r7,r4,lsr#24
  253. and    r4,r4,#&ff
  254. 4cmp    r4,r5:movgt r0,r4:movgt r4,r5:movgt r5,r0
  255. 4cmp    r4,r6:movgt r0,r4:movgt r4,r6:movgt r6,r0
  256. 4cmp    r4,r7:movgt r0,r4:movgt r4,r7:movgt r7,r0
  257. 4cmp    r5,r6:movgt r0,r5:movgt r5,r6:movgt r6,r0
  258. 4cmp    r5,r7:movgt r0,r5:movgt r5,r7:movgt r7,r0
  259. 4cmp    r6,r7:movgt r0,r6:movgt r6,r7:movgt r7,r0
  260. orr    r4,r4,r5,lsl#8
  261. orr    r4,r4,r6,lsl#16
  262. orr    r4,r4,r7,lsl#24
  263. add    r5,r12,#hotkeys
  264. ldr    r6,[r12,#hotkeysize]
  265. .keyevent1
  266. ldmia  r5!,{r0,r7}
  267. 6teq    r4,r0                  ;compare with hotkey
  268. beq    keyevent2
  269. .keyevent3
  270. subs   r6,r6,#8
  271. bne    keyevent1
  272. ldmfd  sp !,{r0,r3-r7,pc}^
  273. .keyevent2
  274. and    r0,r7,#3
  275. add    r0,r0,#1
  276. #Istrb   r0,[r12,#interceptwimp];non-zero > key presses are intercepted
  277. $3teq    r0,r3                  ;same nr of keys?
  278. bne    keyevent3
  279. &:str    r7,[r12,#pollword]     ;will always be non-zero
  280. ldmfd  sp !,{r0,r3-r7,pc}^
  281. ;____________
  282. .mouseevent
  283. +.teq    r3,#%010               ;MENU button
  284. ,4teqeq  r1,#0                  ;X coordinate = 0?
  285. ldreq  r0,[r12,#mouse]
  286. streq  r0,[r12,#pollword]
  287. /Jstreqb r3,[r12,#interceptwimp];non-zero > mouse clicks are intercepted
  288. ldmfd  sp !,{r0,r3-r7,pc}^
  289. 2-.menufile dcb"<MyMenu$M>.Menu":dcb0:align
  290. 34.scanutil dcb"/<MyMenu$Dir>.ScanUtil":dcb0:align
  291. 4-;________________________________________
  292. .servicecall
  293. teq    r1,#&49
  294. teqne  r1,#&4a
  295. teqne  r1,#&27
  296. movnes pc,lr
  297. stmfd  sp !,{r7,lr}
  298. ldr    r12,[r12]
  299. ?4teq    r1,#&49                ;Service_StartWimp
  300. bne    service2
  301. ldr    r7,[r12,#taskhandle]
  302. teq    r7,#0
  303. mvneq  r7,#0
  304. streq  r7,[r12,#taskhandle]
  305. adreq  r0,commandtable
  306. moveq  r1,#0
  307. ldmfd  sp !,{r7,pc}^
  308. .service2
  309. J6teq    r1,#&4a                ;Service_StartedWimp
  310. bne    service3
  311. ldr    r7,[r12,#taskhandle]
  312. cmn    r7,#1
  313. moveq  r7,#0
  314. streq  r7,[r12,#taskhandle]
  315. ldmfd  sp !,{r7,pc}^
  316. .service3
  317. S1;teq    r1,#&27                ;Service_Reset
  318. mov    r7,#0
  319. str    r7,[r12,#taskhandle]
  320. ldmfd  sp !,{r7,pc}^
  321. W-;________________________________________
  322. .mycommand
  323. stmfd  sp !,{r14}
  324. mov    r2,r0
  325. adr    r1,titlestring
  326. mov    r0,#2
  327. swi    "XOS_Module"
  328. ldmfd  sp !,{pc}
  329. .titlestring
  330. dcb "MyMenu":dcb0
  331. .helpstring
  332. dEdcb "MyMenu":dcb9:dcb9:dcb"0.90 ("+d$+") by Richard Atterer":dcb0
  333. .commandtable
  334. f"dcb"Desktop_MyMenu":dcb0:align
  335. dcd mycommand
  336. dcd0:dcd0:dcd0:dcb0
  337. i    align
  338. .task dcb"TASK"
  339. .messagelist
  340. dcd Message_SaveDesktop
  341. dcd Message_MenusDeleted
  342. dcd Message_HelpRequest
  343. q    .mask
  344. r dcd%110000000001100101110001
  345. t1.menuscan dcb"<MyMenu$M>.MenuScan":dcb0:align
  346. u-;________________________________________
  347. wP; If menu is loaded on demand, we have to deal with the following situations
  348. x<; in order to claim/release application memory correctly
  349. y6; (in brackets the changing values of 'menusopen')
  350. {1;When no menu or another task's menu is open:
  351. |1; - hotkey; opens one of our menus ( 0 -> 1 )
  352. }-; - hotkey; executes *commands ( 0 -> 0 )
  353. ~#;When one of our menus is open:
  354. I; - hotkey; would open the SAME menu which is already open ( 1 -> 1 )
  355. 6; - hotkey; opens a DIFFERENT menu ( 1 -> 2 -> 1 )
  356. -; - hotkey; executes *commands ( 1 -> 1 )
  357. L; - a menu entry which leads to a submenu is clicked; opens the submenu,
  358. .;   closes the parent menu ( 1 -> 2 -> 1 )
  359. J; - a menu entry executing *commands is clicked with SELECT ( 1 -> 0 )
  360. J; - a menu entry executing *commands is clicked with ADJUST ( 1 -> 1 )
  361. N; - our menu is closed because the user clicks outside it, or another task
  362. ;   opens one ( 1 -> 0 )
  363. -;________________________________________
  364. .err_nomem
  365. dcd 1<<30
  366. +dcb "Not enough free memory":dcb0:align
  367. .nomemory
  368. mov    r0,#0
  369. mvn    r1,#0
  370. swi    "XWimp_SlotSize"
  371. adr    r0,err_nomem
  372. .wimperror
  373. mov    r1,#1
  374. adr    r2,titlestring
  375. swi    "XWimp_ReportError"
  376. b      poll
  377. -;________________________________________
  378. .start
  379. ldr    r12,[r12]
  380. ldr    r0,[r12,#taskhandle]
  381. cmp    r0,#0
  382. ldrgt  r1,task
  383. swigt  "XWimp_CloseDown"
  384. movgt  r0,#0
  385. strgt  r0,[r12,#taskhandle]
  386. mov    r0,#300
  387. ldr    r1,task
  388. adr    r2,titlestring
  389. adr    r3,messagelist
  390. swi    "XWimp_Initialise"
  391. bvs    closedown
  392. str    r1,[r12,#taskhandle]
  393. mov    r0,#0
  394. str    r0,[r12,#pollword]
  395.  str    r0,[r12,#oldpollword]
  396. str    r0,[r12,#keys]
  397.  strb   r0,[r12,#keyspressed]
  398. add    sp,r12,#mystackend
  399. ;____________
  400.     .poll
  401. d("Poll")
  402. ldr    r0,mask
  403.  ldr    r1,[r12,#oldpollword]
  404. teq    r1,#0
  405. bicne  r0,r0,#1
  406. bicne  r0,r0,#1<<22
  407. add    r1,r12,#buf
  408. add    r3,r12,#pollword
  409. swi    "XWimp_Poll"
  410. bvs    closedown
  411. teq    r0,#0
  412. beq    null_reason
  413. teq    r0,#9
  414. beq    menu_selection
  415. teq    r0,#13
  416. beq    pollword_nonzero
  417. teq    r0,#17
  418. teqne  r0,#18
  419. teqne  r0,#19
  420. bne    poll
  421. .user_message
  422. ldr    r0,[r1,#16]
  423. "teq    r0,#Message_SaveDesktop
  424. beq    mess_savedesk
  425. ,eor    r2,r0,#Message_MenusDeleted 
  426. (teq    r2,#Message_MenusDeleted 
  427. beq    menusdeleted
  428. +eor    r2,r0,#Message_HelpRequest 
  429. 'teq    r2,#Message_HelpRequest 
  430. beq    helprequest
  431. teq    r0,#0
  432. bne    poll
  433. ;____________
  434. .closedown
  435. mvn    r0,#0
  436. ldr    r0,[r12,#taskhandle]
  437. ldr    r1,task
  438. swi    "XWimp_CloseDown"
  439. adr    r3,titlestring
  440. swi    "OS_ExitAndDie"
  441. ;____________
  442. O;note - we needn't read MyMenu$Dir to a buffer on startup because it is not
  443. J;possible that more than one copy of the program runs at the same time
  444. ;(cf 3-247)
  445. .mess_savedesk
  446. mov    r5,r1
  447. ldmia  r1,{r2}
  448. adr    r0,variable
  449. add    r1,r1,r2
  450. mov    r6,r1
  451. sub    r2,sp,r1
  452. mov    r3,#0
  453. swi    "XOS_ReadVarVal"
  454. bvs    savedesk_error
  455. mov    r0,#
  456. ldr    r1,[r5,#20]
  457. swi    "XOS_BPut"
  458. bvs    savedesk_error
  459. mov    r0,#2
  460. mov    r3,r2
  461. mov    r2,r6
  462. swi    "XOS_GBPB"
  463. bvs    savedesk_error
  464. mov    r0,#10
  465. swi    "XOS_BPut"
  466. bvs    savedesk_error
  467. b      poll
  468. ;______
  469. .savedesk_error
  470. mov    r11,r0
  471. add    r1,r12,#buf
  472. ldr    r0,[r1,#8]
  473. str    r0,[r1,#12]
  474. mov    r0,#19
  475. ldr    r2,[r1,#4]
  476. swi    "XWimp_SendMessage"
  477. movvc  r0,r11
  478. b      wimperror
  479. (.variable dcb"MyMenu$Dir":dcb0:align
  480. -;________________________________________
  481. 6;'menusopen' may become 2 for 
  482. E call to Wimp_Poll
  483. I;  1. When one menu is open and a hotkey combination is pressed which
  484.  ;     opens a DIFFERENT menu
  485. K;  2. When an item leading to a submenu is clicked (which will open the
  486. .;     submenu and close its 'parent' menu)
  487. .menusdeleted
  488. ldrb   r0,[r12,#menusopen]
  489. subs   r0,r0,#1
  490. strgeb r0,[r12,#menusopen]
  491. d("menusdeleted^^menusopen is now ^0^")
  492. streq  r0,[r12,#lastopened]
  493. bleq   forgetmenu
  494. b      poll
  495. -;________________________________________
  496. .menu_selection
  497. d("menu_selection")
  498. mov    r6,r1
  499. add    r1,r12,#buf+192
  500. " swi    "Wimp_GetPointerInfo"
  501. ldr    r0,[r1,#8]
  502. $+strb   r0,[r12,#reopenmenu]   ;non-zero
  503. ldr    r2,[r12,#menublock]
  504. ldr    r5,[r12,#lastopened]
  505. ldmia  r6!,{r3}
  506. *G.menusel1                     ;for each item in returned Wimp block
  507. add    r3,r3,#1
  508. ,"ldr    r1,[r5,r3,lsl#2]       
  509. ldmia  r6!,{r3}
  510. .4cmn    r3,#1                  ;further submenus?
  511. beq    execmenu_exec
  512. 0=bic    r1,r1,#&f<<28          ;y > get address of submenu
  513. add    r1,r2,r1
  514. .menusel2
  515. ldr    r4,[r5],#32
  516. rsb    r4,r4,r4,lsl#3
  517. add    r5,r5,r4,lsl#2
  518. cmp    r5,r1
  519. blo    menusel2
  520. sub    r5,r5,#32
  521. sub    r5,r5,r4,lsl#2
  522. b      menusel1
  523. ;-;________________________________________
  524. .execitem12
  525. mov    r11,r0
  526. mov    r0,#0
  527. swi    "XOS_Find"
  528. mov    r0,r11
  529. .execitem6
  530. mov    r1,#2
  531. adr    r2,titlestring
  532. swi    "XWimp_ReportError"
  533. b      execitem8
  534. G-;________________________________________
  535. .pollword_nonzero
  536. d("pollword_nonzero")
  537. ldr    r0,[r12,#pollword]
  538. L str    r0,[r12,#oldpollword]
  539. mov    r0,#0
  540. str    r0,[r12,#pollword]
  541. b      poll
  542. ;____________
  543. .null_reason
  544. S!ldr    r11,[r12,#oldpollword]
  545. d("null_reason^^oldpollword=^11^")
  546. cmn    r11,#1
  547. V"streqb r0,[r12,#interceptwimp]
  548. W streq  r0,[r12,#oldpollword]
  549. beq    poll
  550. mvn    r0,#0
  551. [ str    r0,[r12,#oldpollword]
  552. bic    r11,r11,#1<<31
  553. mov    r11,r11,lsr#2
  554. mov    r10,r11,lsr#16
  555. bic    r11,r11,r10,lsl#16
  556. mov    r0,#0
  557. str    r0,[r12,#pollword]
  558. strb   r0,[r12,#reopenmenu]
  559. ;____________
  560. f-;r10=nr of menu, r11=nr of (submenu) item
  561. .execmenu
  562. d("execmenu^^nr of menu=^10^, nr of item=^11^")
  563. ldrb   r0,[r12,#ondemand]
  564. teq    r0,#0
  565. ldreq  r6,[r12,#menublock]
  566. lMbeq    execmenu3              ;> not on demand, ie menu already in memory
  567. nNldrb   r0,[r12,#menusopen]    ;will contain 0 unless hotkey pressed when a
  568. o8teq    r0,#0                  ;menu was already open
  569. movne  r6,#&8000
  570. bne    execmenu3
  571. ldr    r3,[r12,#totalsize]
  572. ldr    r4,[r12,#hotkeysize]
  573. sub    r0,r3,r4
  574. mov    r3,r0
  575. mvn    r1,#0
  576. swi    "XWimp_SlotSize"
  577. bvs    wimperror
  578. cmp    r0,r3
  579. blt    nomemory
  580. mov    r0,#&4f
  581. adr    r1,menuscan
  582. swi    "XOS_Find"
  583. blvs   forgetmenu
  584. bvs    wimperror
  585. mov    r1,r0
  586. mov    r0,#3
  587. mov    r2,#&8000
  588. 5add    r4,r4,#24              ;for 24 byte header
  589. swi    "XOS_GBPB"
  590. blvs   forgetmenu
  591. bvs    wimperror
  592. mov    r0,#0
  593. str    r0,[r12,#relocadr]
  594. swi    "XOS_Find"
  595. d("execmenu^^loaded on demand")
  596. blvs   forgetmenu
  597. bvs    wimperror
  598. mov    r6,#&8000
  599. ;______
  600. 1.execmenu3                    ;r6=ptr to menu
  601. d("execmenu3^^reloc")
  602. ldr    r0,[r12,#relocadr]
  603. Csubs   r1,r6,r0               ;relocadr <>0 after a soft reset!
  604. beq    execmenu4
  605. Qldr    r4,[r12,#nrofmenus]    ;the direct pointers in menu tree need updating
  606. str    r6,[r12,#relocadr]
  607. mov    r0,r1
  608. d("execmenu^^nr of menus=^4^, amount=^0^")
  609. 0.execmenu1                    ;for each menu
  610. ldr    r2,[r0],#4+28
  611. add    r0,r0,r2,lsl#2
  612. ldmia  r0,{r3}
  613. 9tst    r3,#1<<8               ;title data indirected?
  614. ldrne  r3,[r0,#-28]
  615. addne  r3,r3,r1
  616. strne  r3,[r0,#-28]
  617. A.execmenu2                    ;for each item (r2=nr of items)
  618. ldmib  r0,{r3,r5-r6}
  619. cmn    r3,#1
  620. addne  r3,r3,r1
  621. tst    r5,#1<<8
  622. addne  r6,r6,r1
  623. stmib  r0,{r3,r5-r6}
  624. add    r0,r0,#24
  625. subs   r2,r2,#1
  626. bne    execmenu2
  627. subs   r4,r4,#1
  628. bne    execmenu1
  629. ;______
  630. .execmenu4
  631. ldr    r5,[r12,#menublock]
  632. mov    r2,r5
  633. .execmenu5
  634. subs   r10,r10,#1
  635. ldrpl  r0,[r5],#4+28
  636. rsbpl  r0,r0,r0,lsl#3
  637. addpl  r5,r5,r0,lsl#2
  638. bpl    execmenu5
  639. add    r1,r5,#4
  640. ldr    r1,[r1,r11,lsl#2]
  641. ;______
  642. B;r1=word of item to be executed, r2=ptr to start of menu data,
  643. K;r5=addr of header before wimp menu data, somewhere before current menu
  644. .execmenu_exec
  645. d("exec^^word of item=^1^, start of menu data=^2^, menu header=^5^")
  646. Qmovs   r3,r1,lsr#30           ;menu / memory *comm offset /file *comm offset?
  647. bic    r1,r1,#&f<<28
  648. bne    execitem
  649. 'add    r4,r2,r1               ;menu
  650. .execmenu6
  651. Qldr    r0,[r5],#32            ;search for header before menu pointed to by R1
  652. rsb    r0,r0,r0,lsl#3
  653. add    r5,r5,r0,lsl#2
  654. cmp    r5,r4
  655. blo    execmenu6
  656. sub    r5,r5,r0,lsl#2
  657. sub    r5,r5,#32
  658. ldr    r6,[r12,#lastopened]
  659. Dteq    r5,r6                  ;would this re-open the same menu?
  660. beq    poll
  661. ;ldrneb r0,[r12,#menusopen]
  662. ;addne  r0,r0,#1
  663. ;strneb r0,[r12,#menusopen]
  664. str    r5,[r12,#lastopened]
  665. add    r1,r12,#buf
  666. !swi    "XWimp_GetPointerInfo"
  667. bvs    wimperror
  668. ldmia  r1,{r2-r3}
  669. sub    r2,r2,#64
  670. mov    r1,r4
  671. swi    "XWimp_CreateMenu"
  672. bvs    wimperror
  673. ldrb   r0,[r12,#menusopen]
  674. add    r0,r0,#1
  675. strb   r0,[r12,#menusopen]
  676. b      poll
  677. ;____________
  678. .execitem
  679. ;teq    r3,#%01                ;are *commands in memory?
  680. $bne    execitem3              ;n
  681. d("execitem^^memory")
  682. ldr    r2,[r12,#menublock]
  683. add    r0,r2,r1
  684. .execitem1
  685. mov    r2,r0
  686. ldrb   r1,[r0]
  687. >cmp    r1,#32                 ;is this a 'packed' command?
  688. blt    execitem5
  689. d("execitem/mem^^*$0^")
  690. Fswi    "XWimp_StartTask"      ;COULD use OS_CLI, but this is safer
  691. add    r0,r2,#1
  692. .execitem2
  693. ldrb   r1,[r0],#1
  694. cmp    r1,#32
  695. bge    execitem2
  696. =teq    r1,#0                  ;was this the last command?
  697. $bne    execitem1              ;n
  698. b      execitem8
  699. .execitem5
  700. ldrb   r3,[r0,#1]
  701. orr    r3,r3,r1,lsl#8
  702. sub    r0,r0,r3
  703. d("execitem/mempacked^^*$0^")
  704. swi    "XWimp_StartTask"
  705. add    r0,r2,#3
  706. ldrb   r1,[r0,#-1]
  707. teq    r1,#0
  708. bne    execitem1
  709. b      execitem8
  710. ;____________
  711. .execitem3
  712. d("execitem^^file")
  713. mov    r2,r1
  714. mov    r0,#&4f
  715. adr    r1,menufile+1024
  716. sub    r1,r1,#1024
  717. swi    "XOS_Find"
  718. bvs    execitem6
  719. mov    r1,r0
  720. mov    r0,#1
  721. 0swi    "XOS_Args"             ;write seq ptr
  722. mov    r0,#6
  723. ldr    r3,[r12,#osclilen]
  724. 9swi    "XOS_Module"           ;claim temporary buffer
  725. bvs    execitem12
  726. ldrb   r4,[r12,#special]
  727. mov    r3,r2
  728. .execitem4
  729. swi    "XOS_BGet"
  730. bvs    execitem11
  731. .execitem7
  732. strb   r0,[r3],#1
  733. cmp    r0,#32
  734. bge    execitem4
  735. mov    r0,r2
  736. swi    "XWimp_StartTask"
  737. swi    "XOS_BGet"
  738. bvs    execitem11
  739. (0teq    r0,r4                  ;last command?
  740. movne  r3,r2
  741. bne    execitem7
  742. .execitem11
  743. mov    r0,#7
  744. swi    "XOS_Module"
  745. mov    r0,#0
  746. swi    "XOS_Find"
  747. ;______
  748. .execitem8
  749. ldrb   r0,[r12,#reopenmenu]
  750. d("execitem^^reopenmenu=^0^")
  751. teq    r0,#0
  752. 7/beq    execitem9              ;hotkey press
  753. 84tst    r0,#1                  ;entry with ADJUST
  754. moveq  r0,#0
  755. streq  r0,[r12,#lastopened]
  756. ;Hstreqb r0,[r12,#menusopen]    ;'decrease' (no Message_MenusDeleted!)
  757. beq    execitem10
  758. ldr    r1,[r12,#lastopened]
  759. ldmia  r1!,{r0}
  760. add    r1,r1,r0,lsl#2
  761. @Nswi    "XWimp_CreateMenu"     ;DON'T increase menusopen - is already 1 coz
  762. AQbvs    wimperror              ;NO Msg_MenusDeleted when menu sel. is returned
  763. b      poll
  764. .execitem9
  765. ENldrb   r0,[r12,#menusopen]    ;will be 1 if hotkey pressed while menu open
  766. .execitem10
  767. G@teq    r0,#0                  ;0 if item clicked with SELECT
  768. bleq   forgetmenu
  769. b      poll
  770. J-;________________________________________
  771. .forgetmenu
  772. MC;test whether menu was loaded only on demand, de-allocate if so
  773. stmfd  sp !,{r0-r2,r4,lr}
  774. ldrb   r0,[r12,#ondemand]
  775. teq    r0,#0
  776. ldmeqfdsp !,{r0-r2,r4,pc}^
  777. mov    r0,#0
  778. strb   r0,[r12,#menusopen]
  779. mvn    r1,#0
  780. swi    "XWimp_SlotSize"
  781. ;swi 256+7
  782. d("menu forgotten")
  783. ldmfd  sp !,{r0-r2,r4,pc}^
  784. Y-;________________________________________
  785. .helprequest
  786. adr    r2,helpreplytext
  787. add    r3,r1,#20
  788. .helpreq1
  789. ldrb   r0,[r2],#1
  790. strb   r0,[r3],#1
  791. teq    r0,#0
  792. bne    helpreq1
  793. c7mov    r0,#((helpreplytextend-helpreplytext)+23)
  794. stmia  r1,{r0}
  795. e&mov    r0,#Message_HelpReply 
  796. f(orr    r0,r0,#Message_HelpReply 
  797. str    r0,[r1,#16]
  798. ldr    r0,[r1,#8]
  799. str    r0,[r1,#12]
  800. mov    r0,#17
  801. ldr    r2,[r1,#4]
  802. swi    "XWimp_SendMessage"
  803. bvc    poll
  804. b      wimperror
  805. .helpreplytext
  806. dcb"Name: 
  807. MyMenu
  808. s,dcb"Purpose: User-designed menu trees|M"
  809. t)dcb"Author: 
  810.  1996 Richard Atterer|M"
  811. u1dcb"Version: V0.90 ("+date$+") Freeware":dcb0
  812. .helpreplytextend
  813. w-;________________________________________
  814. debugging%
  815.   [optp
  816.   align
  817. debug(p,washerefile$,20):]
  818. :[optp
  819. rmablock(p)
  820. -;________________________________________
  821. ]O%+=128:[optp:]:O%-=128
  822. 2)=0 A$=
  823. i%=code% 
  824. 128:$i%=A$:
  825. "Size: ";O%-code%"/&"~O%-code%" bytes (";
  826. ((O%-code%)/102.4+.5)/10" kBytes)."'"Time: ";
  827. /100" seconds."
  828. "Save "+save$+" "+
  829. ~code%+" "+
  830. "SetType "+save$+" "+type$
  831.  REPEAT:A%=INKEY(0):MOUSEB%,B%,C%:UNTIL A%>-1ORC%>0
  832.  SYS"OS_Module",11,code%,O%-code%
  833. rmablock(p)
  834. P%:Otemp%=O%:[optp
  835. -;________________________________________
  836. ;offsets in RMA block
  837. .taskhandle     dcd0
  838. .pollword       dcd0
  839. .oldpollword    dcd0
  840. .relocadr       dcd0
  841. Q.keyspressed    dcb0          ;nr of keys currently pressed, possibly also >4
  842. ?.menusopen      dcb0          ;0, 1 or, for a short time, 2
  843. Q.reopenmenu     dcb0        ;>0 to check whether menu 2B reopened in execitem
  844. N.interceptwimp  dcb0:align    ;>0 for the postfilter to intercept all keys
  845. E.keys           dcd0          ;key last pressed is in lowest byte
  846. B.menublock      dcd0          ;ptr to header before first menu
  847. ;.lastopened     dcd0          ;addr of menu last opened
  848. +.buf            ]:O%+=256:P%+=256:[optp
  849. +.mystack        ]:O%+= 20:P%+= 20:[optp
  850. .mystackend
  851. ;______
  852. C;the following variables are loaded from start of file MenuScan
  853. .totalsize      dcd0
  854. .hotkeysize     dcd0
  855. .osclilen       dcd0
  856. .nrofmenus      dcd0
  857.  .ondemand       dcb0;NB byte
  858. &.special        dcb0;NB byte:align
  859. .mouse          dcd0
  860. .hotkeys
  861. .rmablocksize%
  862. -;________________________________________
  863. O%=Otemp%:=0
  864. d(a$)
  865. debugging%
  866.   [optp
  867.   bl     IWasHere
  868.   dcb a$:dcb0:align:]
  869.